using System;
using System.Collections.Generic;
using System.Data;

using PMServiceDesk.DataType;
using PMServiceDesk.Parameters.Constantes;
using PMServiceDesk.Utils.ManejoDatos;

namespace PMServiceDesk.DataAccess
{
    public class DocumentoTransicionEstadoData
    {
        #region Variables

        private string _select;
        private string _join;
        private string _where;
        private int _totalRegistros = 0;

        private Dictionary<string, object> _parametrosConsulta;

        #endregion

        #region Propiedades

        protected string Where
        {
            get
            {
                if (_where == "") return "";

                return "WHERE " + _where.Substring(3);
            }
        }

        #endregion

        #region Constructores

        public DocumentoTransicionEstadoData()
        {
            this._limpiarConsulta();
        }

        #endregion

        #region Metodos

        private void _limpiarConsulta()
        {
            _select = "";
            _join = "";
            _where = "";
            _parametrosConsulta = new Dictionary<string, object>();
        }

        private DataUtil _consultaDataReader(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            DataUtil data = null;

            if(paginaActual==0)
                data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, _select + _join + this.Where + orderBy,_parametrosConsulta);
            else
                data = DataReader.ReturnPagingReader(TypeDataBase.PMServiceDesk, _select, _join, this.Where, this._parametrosConsulta, paginaActual, cantidadMostrar, orderBy, ref _totalRegistros);

            this._limpiarConsulta();

            return data;
        }

        public void Grabar(DocumentoTransicionEstadoType documentoTransicionEstado)
        {
            using (DataUtil d = this._grabar())
            {
                d.AddParameter("@ID", (documentoTransicionEstado.Id == null ? "0" : documentoTransicionEstado.Id));
                d.AddParameter("@TRANSICIONESTADOID", documentoTransicionEstado.TransicionEstadoId);
                d.AddParameter("@EXTENSIONDOCUMENTOID", documentoTransicionEstado.ExtensionDocumentoId);
                d.AddParameter("@NOMBRE", documentoTransicionEstado.Nombre);
                d.AddParameter("@COMENTARIO", documentoTransicionEstado.Comentario);

                documentoTransicionEstado.Id = d.ExecuteScalar(true).ToString();
            }
        }

        public void Eliminar(string id)
        {
            using (DataUtil d = this._eliminar())
            {
                d.AddParameter("@ID", id);

                d.ExecuteNonQuery();
            }
        }

        public void EliminarPorPermisoRolId(string permisoRolId)
        {
            using (DataUtil d = this._eliminarPorPermisoRol())
            {
                d.AddParameter("@PERMISOROLID", permisoRolId);

                d.ExecuteNonQuery();
            }
        }

        public DocumentoTransicionEstadoType Cargar()
        {
            List<DocumentoTransicionEstadoType> l = this.CargarLista();

            if (l.Count == 0) return null;

            return l[0];
        }

        public List<DocumentoTransicionEstadoType> CargarLista()
        {
            List<DocumentoTransicionEstadoType> l = new List<DocumentoTransicionEstadoType>();

            using (DataUtil d = this._consultaCargar())
                using (IDataReader r = d.ExecuteReader())
                {
                    DocumentoTransicionEstadoType o = null;

                    while (r.Read())
                    {
                        o = new DocumentoTransicionEstadoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.TransicionEstadoId = r.GetValue(d.GetOrdinalReader("TRANSICIONESTADOID")).ToString();
                        o.ExtensionDocumentoId = r.GetValue(d.GetOrdinalReader("EXTENSIONDOCUMENTOID")).ToString();
                        o.ExtensionDocumento = r.GetValue(d.GetOrdinalReader("EXTENSIONDOCUMENTO")).ToString();
                        o.Nombre = r.GetValue(d.GetOrdinalReader("NOMBRE")).ToString();
                        o.Comentario = r.GetValue(d.GetOrdinalReader("COMENTARIO")).ToString();

                        l.Add(o);
                    }
                }

            return l;
        }

        public List<DocumentoTransicionEstadoType> CargarListaVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            List<DocumentoTransicionEstadoType> l = new List<DocumentoTransicionEstadoType>();

            using (DataUtil d = this._consultaCargarVista(paginaActual, cantidadMostrar,orderBy))
                using (IDataReader r = d.ExecuteReader())
                {
                    DocumentoTransicionEstadoType o = null;

                    while (r.Read())
                    {
                        o = new DocumentoTransicionEstadoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.TransicionEstadoId = r.GetValue(d.GetOrdinalReader("TRANSICIONESTADOID")).ToString();
                        o.ExtensionDocumentoId = r.GetValue(d.GetOrdinalReader("EXTENSIONDOCUMENTOID")).ToString();
                        o.ExtensionDocumento = r.GetValue(d.GetOrdinalReader("EXTENSIONDOCUMENTO")).ToString();
                        o.Nombre = r.GetValue(d.GetOrdinalReader("NOMBRE")).ToString();
                        o.Comentario = r.GetValue(d.GetOrdinalReader("COMENTARIO")).ToString();

                        l.Add(o);
                    }
                }

            if (l.Count <= _totalRegistros) l.Capacity = _totalRegistros;

            return l;
        }

        public List<DocumentoTransicionEstadoType> CargarTransicion(string paqueteTrabajoId,string estadoOrigenId, string estadoDestinoId, string rolId)
        {
            List<DocumentoTransicionEstadoType> l = new List<DocumentoTransicionEstadoType>();

            using (DataUtil d = this._consultaCargarTransicion( paqueteTrabajoId, estadoOrigenId,  estadoDestinoId,  rolId))
                using (IDataReader r = d.ExecuteReader())
                {
                    DocumentoTransicionEstadoType o = null;

                    while (r.Read())
                    {
                        o = new DocumentoTransicionEstadoType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.EstadoPaqueteTrabajoOrigenId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOORIGENID")).ToString();
                        o.EstadoPaqueteTrabajoOrigen = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOORIGEN")).ToString();
                        o.EstadoPaqueteTrabajoDestinoId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJODESTINOID")).ToString();
                        o.EstadoPaqueteTrabajoDestino = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJODESTINO")).ToString();
                        o.Documento_A_Adjuntar = r.GetValue(d.GetOrdinalReader("DOCUMENTO_A_ADJUNTAR")).ToString();
                        o.FechaRegistro = ConvertFormat.Date_To_Char(r.GetValue(d.GetOrdinalReader("FECHAREGISTRO")),Formatos.Fecha_DDMMYYYY_hhmmss_tt);
                        o.UsuarioRegistro = r.GetValue(d.GetOrdinalReader("USUARIOREGISTRO")).ToString();
                        o.Documento_Adjunto = r.GetValue(d.GetOrdinalReader("DOCUMENTO_ADJUNTO")).ToString();
                        o.DocumentoDigitalId = r.GetValue(d.GetOrdinalReader("DOCUMENTODIGITALID")).ToString();

                        l.Add(o);
                    }
                }

            return l;
        }

        #endregion

        #region SQL

        private DataUtil _grabar()
        {
            string sql = @"IF(NOT EXISTS(SELECT 1 FROM DOCUMENTOTRANSICIONESTADO WHERE ID=@ID)) 
                           BEGIN
                               INSERT INTO DOCUMENTOTRANSICIONESTADO
                               (
                                   TRANSICIONESTADOID
                                  ,EXTENSIONDOCUMENTOID
                                  ,NOMBRE
                                  ,COMENTARIO
                               )
                               VALUES
                               (
                                   @TRANSICIONESTADOID
                                  ,@EXTENSIONDOCUMENTOID
                                  ,@NOMBRE
                                  ,@COMENTARIO
                               )

                               SELECT @@IDENTITY
                           END
                           ELSE
                           BEGIN
                               UPDATE DOCUMENTOTRANSICIONESTADO SET
                               TRANSICIONESTADOID=@TRANSICIONESTADOID
                              ,EXTENSIONDOCUMENTOID=@EXTENSIONDOCUMENTOID
                              ,NOMBRE=@NOMBRE
                              ,COMENTARIO=@COMENTARIO
                               WHERE ID=@ID

                               SELECT @ID
                           END";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _eliminar()
        {
            string sql = @"DELETE FROM DOCUMENTOTRANSICIONESTADO WHERE ID=@ID";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _eliminarPorPermisoRol()
        {
            string sql = @"DELETE FROM DOCUMENTOTRANSICIONESTADO WHERE TRANSICIONESTADOID IN (SELECT TE.ID FROM TRANSICIONESTADO [TE] WHERE TE.PERMISOROLID=@PERMISOROLID)";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _consultaCargar()
        {
            _select = @"SELECT
                        DO.ID
                       ,DO.TRANSICIONESTADOID
                       ,DO.EXTENSIONDOCUMENTOID
                       ,EXTDOC.ABREVIATURA          [EXTENSIONDOCUMENTO]
                       ,DO.NOMBRE
                       ,DO.COMENTARIO
                        ";

            _join = @"FROM DBO.DOCUMENTOTRANSICIONESTADO [DO] 
                      INNER JOIN PARAMETRO EXTDOC ON DO.EXTENSIONDOCUMENTOID = EXTDOC.ID
                      ";

            return this._consultaDataReader();
        }

        private DataUtil _consultaCargarVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _select = @"SELECT
                        DO.ID
                       ,DO.TRANSICIONESTADOID
                       ,DO.EXTENSIONDOCUMENTOID
                       ,EXTDOC.ABREVIATURA          [EXTENSIONDOCUMENTO]
                       ,DO.NOMBRE
                       ,DO.COMENTARIO
                        ";

            _join = @"FROM DBO.DOCUMENTOTRANSICIONESTADO [DO] 
                      INNER JOIN PARAMETRO EXTDOC ON DO.EXTENSIONDOCUMENTOID = EXTDOC.ID
                      ";

            return this._consultaDataReader(paginaActual, cantidadMostrar, orderBy);
        }

        private DataUtil _consultaCargarTransicion(string paqueteTrabajoId,string estadoOrigenId, string estadoDestinoId, string rolId)
        {
            string sql = @"SELECT
                            DOC.ID													[ID]
                            ,TRA.ESTADOORIGENID										[ESTADOPAQUETETRABAJOORIGENID]
                            ,ESTORI.NOMBRE											[ESTADOPAQUETETRABAJOORIGEN]
                            ,TRA.ESTADODESTINOID									[ESTADOPAQUETETRABAJODESTINOID]
                            ,ESTDES.NOMBRE											[ESTADOPAQUETETRABAJODESTINO]
                            ,DOC.NOMBRE + '.' + EXT.ABREVIATURA						[DOCUMENTO_A_ADJUNTAR]
                            ,DOCPAQ.FECHAREGISTRO									[FECHAREGISTRO]
                            ,RECREG.NOMBRE											[USUARIOREGISTRO]
                            ,DOCPAQ.NOMBREARCHIVO									[DOCUMENTO_ADJUNTO]
                            ,DOCPAQ.DOCUMENTODIGITALID								[DOCUMENTODIGITALID]
                            FROM DOCUMENTOTRANSICIONESTADO DOC
                            INNER JOIN TRANSICIONESTADO TRA ON TRA.ID = DOC.TRANSICIONESTADOID
                            INNER JOIN PERMISOROLPAQUETETRABAJO PER ON PER.ID = TRA.PERMISOROLID 
                            INNER JOIN ESTADOPAQUETETRABAJO	ESTORI ON ESTORI.ID = TRA.ESTADOORIGENID
                            INNER JOIN ESTADOPAQUETETRABAJO	ESTDES ON ESTDES.ID = TRA.ESTADODESTINOID
                            INNER JOIN PARAMETRO EXT ON EXT.ID = DOC.EXTENSIONDOCUMENTOID
                            LEFT JOIN DOCUMENTOTRANSICIONPAQUETETRABAJO DOCTRA ON DOCTRA.DOCUMENTOTRANSICIONESTADOID = DOC.ID
                            LEFT JOIN DOCUMENTOPAQUETETRABAJO DOCPAQ ON DOCPAQ.ID = DOCTRA.DOCUMENTOPAQUETETRABAJOID AND DOCPAQ.PAQUETETRABAJOID=@PAQUETETRABAJOID
                            LEFT JOIN PAQUETETRABAJO [PAQ] ON PAQ.ID = DOCPAQ.PAQUETETRABAJOID
                            LEFT JOIN USUARIORECURSO [USUREG] ON USUREG.USUARIOID = DOCPAQ.USUARIOREGISTROID
                            LEFT JOIN RECURSO [RECREG] ON RECREG.ID = USUREG.RECURSOID AND RECREG.PROYECTOID = PAQ.PROYECTOID
                            WHERE TRA.ESTADOORIGENID=@ESTADOORIGENID
                            AND TRA.ESTADODESTINOID = @ESTADODESTINOID
                            AND PER.ROLID=@ROLID";

            _parametrosConsulta.Add("@PAQUETETRABAJOID", paqueteTrabajoId);
            _parametrosConsulta.Add("@ESTADOORIGENID",estadoOrigenId);
            _parametrosConsulta.Add("@ESTADODESTINOID", estadoDestinoId);
            _parametrosConsulta.Add("@ROLID", rolId);

            return new DataUtil(TypeDataBase.PMServiceDesk,CommandType.Text,sql,_parametrosConsulta);
        }

        public void FiltrarPorId(string id)
        {
            _where += @"AND DO.ID=@ID
                                 ";

            _parametrosConsulta.Add("@ID", id);
        }
        public void FiltrarPorTransicionEstadoId(string transicionEstadoId)
        {
            _where += @"AND DO.TRANSICIONESTADOID=@TRANSICIONESTADOID
                                 ";

            _parametrosConsulta.Add("@TRANSICIONESTADOID", transicionEstadoId);
        }
        public void FiltrarPorExtensionDocumentoId(string extensionDocumentoId)
        {
            _where += @"AND DO.EXTENSIONDOCUMENTOID=@EXTENSIONDOCUMENTOID
                                 ";

            _parametrosConsulta.Add("@EXTENSIONDOCUMENTOID", extensionDocumentoId);
        }
        public void FiltrarPorNombre(string nombre)
        {
            _where += @"AND DO.NOMBRE  LIKE '%' + @NOMBRE + '%'
                                 ";

            _parametrosConsulta.Add("@NOMBRE", nombre);
        }
        public void FiltrarPorComentario(string comentario)
        {
            _where += @"AND DO.COMENTARIO  LIKE '%' + @COMENTARIO + '%'
                                 ";

            _parametrosConsulta.Add("@COMENTARIO", comentario);
        }

        #endregion
    }
}
